'use strict';

// 1. 引入系统模块
let http = require('http');
let fs = require('fs');
let path = require('path');

// 2. 获取文件所在根目录的绝对路径，默认当前路径
let rootPath = path.resolve(process.argv[2] || '.');

// 3. 判断传入的请求路径是否存在，是否是文件
function handle(pathList, response) {
    // 存储文件
    let file
    // 判断请求的路径是否存在
    let flag = pathList.some(item => {
        // 如果请求的路径存在
        if (fs.existsSync(item)) {
            // 获取文件状态
            let stat = fs.statSync(item);
            // 判断是否是文件
            if (stat.isFile()) {
                // 将 item 赋值给 file
                file = item;
                // 结束循环
                return true;
            }
        } else {
            // 请求的路径不存在
            return false;
        }
    });
    if (flag) {
        // 如果请求路径存在，且是文件
        // 写入 200 成功头文件
        response.writeHead(200);
        // 将文件流导向response
        fs.createReadStream(file).pipe(response);
    } else {
        // 请求路径不存在，或不是文件
        // 写入 404 失败头文件
        response.writeHead(404);
        // 结束可写流，并汇报错误信息
        response.end('404 Not Found');
    }
}

// 4. 创建http服务器
let server = http.createServer((request, response) => {
    // 获取请求的路径
    let requestPath = request.url;
    // 判断请求的路径是否是浏览器图标
    if (requestPath !== '/favicon.ico') {
        // 获取完整路径
        let fullPath = path.join(rootPath, requestPath);
        // 获取文件状态
        fs.stat(fullPath, (err, status) => {
            // 如果没错，且是文件夹
            if (!err && status.isDirectory()) {
                let pathList = [path.join(fullPath, 'index.html'), path.join(fullPath, 'default.html')];
                // 调用handle()函数
                handle(pathList, response);
            } else if (!err && status.isFile()) {
                // 如果没错，且是文件
                // 打印成功信息和请求的路径
                console.log('200' + request.url);
                // 写入 200 成功头文件
                response.writeHead(200);
                // 将文件流导向response
                fs.createReadStream(fullPath).pipe(response);
            } else {
                // 出现错误，或不是文件
                // 打印错误信息和请求的路径
                console.log('404' + request.url);
                // 写入 404 失败头文件
                response.writeHead(404);
                // 结束可写流，并汇报错误信息
                response.end('404 Not Found');
            }
        });
    }
});

// 5. 监听 8080 端口，并打印服务器运行位置
server.listen(8080);
console.log('Server is running at http://127.0.0.1:8080');